package com.edu.exam.entity.exampaper.management;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

/**
 * 试卷内容实体类
 *
 * <p>试卷内容实体用于管理试卷的具体内容和版本信息，支持内容存储、
 * 格式管理和版本跟踪。是试卷存储与版本控制的核心组件。</p>
 *
 * <p>核心功能：
 * - 内容管理：存储试卷的完整内容信息
 * - 格式支持：支持多种内容格式（HTML、JSON等）
 * - 版本跟踪：记录内容的版本信息和变更历史
 * - 变更记录：详细记录内容变更的原因和描述</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Accessors(chain = true)
public class PaperContent {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 关联试卷ID
     *
     * <p>关联的试卷ID，对应exam_paper表的主键。
     * 用于建立试卷与内容的关联关系。</p>
     */
    @Column(name = "paper_id", nullable = false)
    private Long paperId;

    /**
     * 试卷内容
     *
     * <p>试卷的完整内容，支持HTML、JSON等格式。
     * 内容采用TEXT类型存储，支持大容量文本数据。</p>
     */
    @Column(name = "content", nullable = false, columnDefinition = "TEXT")
    private String content;

    /**
     * 内容格式
     *
     * <p>内容的存储格式类型。
     * 支持的格式包括：HTML、JSON、XML、MARKDOWN等。</p>
     */
    @Column(name = "format", nullable = false, length = 20)
    private String format = "HTML";

    /**
     * 版本时间
     *
     * <p>内容版本的创建时间。
     * 用于标识内容的版本时间点，支持版本排序和比较。</p>
     */
    @Column(name = "version_time", nullable = false)
    private LocalDateTime versionTime;

    /**
     * 版本创建人
     *
     * <p>内容版本的创建人员。
     * 记录是谁在什么时候创建了这个版本的内容。</p>
     */
    @Column(name = "version_by", nullable = false, length = 50)
    private String versionBy;

    /**
     * 变更说明
     *
     * <p>本次内容变更的详细说明。
     * 描述为什么要进行这次变更，变更的主要内容等。</p>
     */
    @Column(name = "change_note", length = 200)
    private String changeNote;

    /**
     * 内容大小
     *
     * <p>内容的字符数大小。
     * 用于统计和分析内容规模。</p>
     */
    @Column(name = "content_size")
    private Integer contentSize;

    /**
     * 内容摘要
     *
     * <p>内容的简短摘要信息。
     * 用于快速预览内容的主要信息。</p>
     */
    @Column(name = "content_summary", length = 500)
    private String contentSummary;

    /**
     * 是否为当前版本
     *
     * <p>标识是否为试卷的当前有效版本。
     * true表示当前版本，false表示历史版本。</p>
     */
    @Column(name = "is_current", nullable = false)
    private Boolean isCurrent = false;

    /**
     * 是否删除
     *
     * <p>软删除标记，标识记录是否已删除。
     * true表示已删除，false表示未删除。</p>
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    // ================================
    // 审计字段
    // ================================

    @CreationTimestamp
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    @UpdateTimestamp
    @Column(name = "updated_time")
    private LocalDateTime updatedTime;

    @Version
    @Column(name = "version")
    private Integer version = 0;
}